本文将涉及到字典
和类
。字典可以有效地组织数据,可以将数据与名称关联(类似于Map),从而实现快速查找。另外,也可以自定义类来处理一些功能,通过为对象增加一些属性和方法完成所需的功能。
所需文件获取地址:http://python.itcarlow.ie/chapter6/hfpy_ch6_data.zip
字典dictionary
字典是一个内置的数据结构,允许将数据与键进行关联,这样可以使内存中的数据与实际数据的结构保持一致。也可以称之为“映射”、“散列”、“关联数组”等。
创建字典dict
可以使用两种方式进行创建空字典,一种是使用大括号创建,一种是使用工厂函数dict()
创建。1
2
3
4
5
6
7
8 cheese = {}
palin = dict()
type(cheese)
<class 'dict'>
>>> type(palin)
<class 'dict'>
添加数据
通过将值与键关联,向这两个字典中添加一些数据。注意两种添加方式的不同。1
2
3
4'Name'] = 'John Cheese' cheese[
'Occupations'] = ['actor', 'comedian', 'writer', 'file producer'] cheese[
'Name' : 'John Cheese', 'Occupations' : ['actor', 'comedian', 'writer', 'file producer']} palin = {
访问数据
通过字典名称加上[key]
就可以访问到对应的值。1
2
3
4
5
6'Name'] palin[
'John Cheese'
'Occupations'] cheese[
['actor', 'comedian', 'writer', 'file producer']
'Occupations'][2] cheese[
'writer'
与列表不同的是,字典并不会维持插入的顺序,只是保持key-value之间的关联关系。
完成上篇文章中的需求,现在运动员的数据变成了Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22
这种形式,其中不仅包含运动员数据,还有其他一些信息,需要进行特殊处理。
1 | def sanitize(time_str): |
类
方法、属性、实例
定义类
使用class
关键字来定义类,同时可以使用__init__()
方法来完成类的初始化构造(类似于Java中的构造方法)。1
2
3
4class Athlete:
def __init__(self):
# 完成对象'Athlete'的初始化工作
...
创建对象实例
在创建类的实例时,实际上调用了__init()__
方法对类的实例进行了初始化。1
2
3
4a = Athlete()
b = Athlete()
c = Athlete()
d = Athlete()
self的重要性
self
类似于Java中的this
,用于指向当前对象实例。
定义一个类时,实际上实在定义一个定制工厂函数,任何可以在代码中使用这个工厂函数来创建实例:
Python在处理a = Athlete()
这行代码时,会把工厂函数调用转化为以下调用,可以明确类(Athlete)、方法(__init__()
)和所处理对象实例(a):Athlete().__init__(a)
如果没有self
参数这个赋值,Python解释器将无法得出方法调用要应用到哪个实例,self
参数可以帮助标识要处理哪个对象实例的数据。
每个方法的第一个参数都是self
下面对Athlete
对象进行扩展,在一个名为thing
的属性中存储一个值,同时增加一个how_big()
方法返回thing
的长度。1
2
3
4
5class Athlete:
def __init__(self, value=0):
self.thing = value
def how_big(self):
return(len(self.thing))
在一个对象实例调用类方法时,Python要求第一个参数是调用对象实例,这往往赋至各方法的self
参数。
你写的代码 | Python执行的代码 |
---|---|
d = Athlete("Xiaoming") |
Athlete.__init__(d, "Xiaoming") |
d.how_big() |
Athlete.how_big(d) |
利用类存储数据改写之前的代码
1 | def get_coach_data(filename): |
添加新的方法
当需要额外新的功能时,可以向类中添加新的方法来实现所需的功能。1
2
3
4
5
6
7
8
9
10
11
12
13
14class Athlete:
def __init__(self, name, dob=None, times=[]):
self.name = name
self.dob = dob
self.times = times
# 获取时间前3的数据列表
def getTop3(self):
return sorted(set(sanitize(str) for str in self.times))[0:3]
# 添加一条新的时间数据
def add_time(self, time):
self.times.append(time)
# 添加多条新的数据
def add_times(self,times):
self.times.extend(times)
类的继承
Python允许通过继承来创建一个类,包括用list、set、dict提供的内部数据结构类。
下面定义了一个NameList类,()
中的list
就表示它继承自list
,因此它就具有了list
的相关属性和方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class NameList(list):
def __init__(self, name):
list.__init__([])
self.name = name
'a') nameList = NameList(
type(nameList)
<class '__main__.NameList'>
>>> nameList.append(2)
>>> nameList.append('b')
>>> nameList
[2, 'b']
nameList.name
'a'
利用继承重写Athlete
类:1
2
3
4
5
6
7
8
9
10# 继承自list类
class AthleteList(list):
def __init__(self, name, dob=None, times=[]):
list.__init__([])
self.name = name
self.dob = dob
self.extend(times) # 不再吸引times属性,数据本身就是
# 获取时间前3的数据列表
def getTop3(self):
return sorted(set(sanitize(str) for str in self))[0:3]
其他知识点
array.pop(i)
pop()
属于array的方法,可以删除索引i处的数值,并返回该数值。默认参数为-1,因此默认会删除并返回数组中的最后一个元素。1
2
3
4
5
6
7
81, 2, 3, 4] array = [
# 弹出最后一个元素 array.pop()
4
2) # 弹出索引2处的元素 array.pop(
3
array
[1, 2]
>>>
list set dict
名称 | 特点 |
---|---|
list | 列表,数据有序,可重复 |
set | 集合,数据无序,不可重复 |
dict | 键值对,若把key-value 看作一个整体,那么dict 与set 类似 |